package com.wjw.java.others.innerClass_;

/**
 * 局部内部类：定义在外部类的局部位置,比如方法中或代码块
 * 本质上是一个类(拥有类的成员)、地位上是一个局部变量(不能使用访问修饰符修饰)
 * -------------------------------------------------------------------------------
 * 1.定义在外部类的局部位置,通常在方法里或代码块中
 * 2.局部内部类访问外部类的成员,直接访问即可,包括private的
 * 3.外部类访问局部内部类的成员,先创建局部内部类对象,然后再访问
 * 4.不能添加访问修饰符,但是能使用final修饰,使用final修饰后无法被继承
 * 5.作用域仅仅在定义它的方法中或代码块中
 * 6.外部其他类不能访问局部内部类(因为局部内部类的地位是一个局部变量)
 * 7.如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用
 *   外部类名.this.成员
 * -------------------------------------------------------------------------------
 */
//外部其他类
public class PartInnerClass {
    public static void main(String[] args) {
        Outer1 outer1 = new Outer1();
        outer1.outerMethod2();
    }
}
//外部类
class Outer1{
    private String msg = "Outer1你好啊";
    private void outerMethod1(){
        System.out.println("外部类方法：outerMethod1()");
    }
    public void outerMethod2(){
        //局部内部类：
        final class Inner1{
            private String msg = "Inner1你好啊";
            public void innerMethod1(){
                System.out.println("msg:"+msg);//就近原则：Inner1你好啊
                //Outer1.this本质上就是外部类的对象,即哪个类调用了outerMethod2(),Outer1.this就是哪个对象
                System.out.println("msg:"+Outer1.this.msg);//Outer1你好啊
                outerMethod1();
            }
        }
        Inner1 inner1 = new Inner1();
        inner1.innerMethod1();
    }
}